﻿using System;
using System.Text;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using LAPI.Core;

namespace LAPI.Data.Model
{
    /// <summary>
    /// Modelo de la tabla 'CentroDeportivo'
    /// </summary>
    public class CentroDeportivo
    {
        #region Model
        //PK
        [DataType(DataType.Text)]
        [Display(Name = "#")]
        public int idCentroDeportivo { get; set; }

        //DATA
        [Required]
        [DataType(DataType.MultilineText)]
        [Display(Name = "Nombre Centro Deportivo:")]
        [FieldValue("Nombre Centro Deportivo")]
        public String descripcion { get; set; }

        public Boolean activo { get; set; }

        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "Dirección:")]
        [FieldValue("Dirección")]
        public String direccion { get; set; }

        [Required]
        [DataType(DataType.PhoneNumber)]
        [Display(Name = "Teléfono:")]
        [FieldValue("Teléfono")]
        public String telefono { get; set; }
        #endregion 

        #region Data Helper
        public const String Table = "CENTRODEPORTIVO";
        public const String Columns = "ID_CENTRODEPORTIVO, descripcion, activo, direccion, telefono";
        #endregion

        #region Insert Helper

        /// <summary>
        /// Crea la cadena con todas las columnas necesarias en una sentencia insert.
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToInsertColumns()
        {
            return "descripcion, direccion, telefono, activo";
        }

        /// <summary>
        /// Crea una cadena con todos los valores a insertar en una sentencia insert.
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToInsertValues()
        {
            StringBuilder sentence = new StringBuilder();
            sentence.Append("'");
            sentence.Append(this.descripcion);
            sentence.Append("','");
            sentence.Append(this.direccion);
            sentence.Append("','");
            sentence.Append(this.telefono);          
            sentence.Append("',1"); //activo
            return sentence.ToString();
        }
        #endregion

        #region Update Helper 

        /// <summary>
        /// Crea la cadena 'SET x1=y1, x2=y2' de una sentencia update.
        /// <p>Actualiza los siguientes datos del modelo:</p>
        /// <ul>
        /// <li>Descripcion</li>
        /// <li>Direccion</li>
        /// <li>Telefono</li>
        /// </ul>
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToUpdate()
        {
            StringBuilder sentence = new StringBuilder();
            sentence.Append("Descripcion = '");
            sentence.Append(this.descripcion);            
            sentence.Append("'");
            sentence.Append(", Direccion = '");
            sentence.Append(this.direccion);
            sentence.Append("'");
            sentence.Append(", telefono = '");
            sentence.Append(this.telefono);
            sentence.Append("'");

            return sentence.ToString();
        }

        /// <summary>
        /// Crea la cadena 'SET x1=y1, x2=y2' de una sentencia update.
        /// <p>Actualiza los siguientes datos del modelo:</p>
        /// <ul>
        /// <li>Activo</li>
        /// </ul>
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToUpdateEstado()
        {
            StringBuilder sentence = new StringBuilder();
            sentence.Append("Activo = '");
            sentence.Append(this.activo ? 1: 0);
            sentence.Append("'");

            return sentence.ToString();
        }
        #endregion

        /// <summary>
        /// Método para convertir un Dataset en el modelo.
        /// </summary>
        /// <param name="response">Dataset obtenido en una consulta</param>
        /// <returns>Colección con los modelos obtenidos en la conversión</returns>
        public static System.Collections.Generic.List<LAPI.Data.Model.CentroDeportivo> toModel(System.Data.DataSet response)
        {
            System.Collections.Generic.List<LAPI.Data.Model.CentroDeportivo> result = new System.Collections.Generic.List<Data.Model.CentroDeportivo>();

            foreach (System.Data.DataRow item in response.Tables[0].Rows)
            {
                LAPI.Data.Model.CentroDeportivo model = new Data.Model.CentroDeportivo();
                model.descripcion = item["descripcion"].ToString();
                model.idCentroDeportivo = Convert.ToInt32(item["id_CentroDeportivo"].ToString());
                model.telefono = item["telefono"].ToString();
                model.direccion = item["direccion"].ToString();
                model.descripcion = item["descripcion"].ToString();
                model.activo = Convert.ToBoolean(item["activo"].ToString());

                result.Add(model);
            }

            return result;
        }

        /// <summary>
        /// Método para convertir una colección del modelo, en un JSON
        /// </summary>
        /// <param name="models">colección del modelo</param>
        /// <returns>JSON de la colección</returns>
        public static String toJson(System.Collections.Generic.List<LAPI.Data.Model.CentroDeportivo> models)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            System.IO.StringWriter sw = new System.IO.StringWriter(sb);

            using (Newtonsoft.Json.JsonWriter jsonWriter = new Newtonsoft.Json.JsonTextWriter(sw))
            {
                jsonWriter.Formatting = Newtonsoft.Json.Formatting.Indented;
                jsonWriter.WriteStartObject();
                jsonWriter.WritePropertyName("items");
                jsonWriter.WriteStartArray();

                foreach (var item in models)
                {
                    jsonWriter.WriteStartObject();
                    jsonWriter.WritePropertyName("id");
                    jsonWriter.WriteValue(item.idCentroDeportivo);
                    jsonWriter.WritePropertyName("data");
                    jsonWriter.WriteValue(item.descripcion);
                    jsonWriter.WriteEndObject();
                }
                jsonWriter.WriteEndArray();
                jsonWriter.WriteEndObject();
            }

            return sb.ToString();
        }

        public override String ToString()
        {
            return "[CentroDeportivo]{idCentroDeportivo:" + idCentroDeportivo +
                ",descripcion:" + descripcion +
                ",direccion:" + direccion +
                ",telefono:" + telefono +
                "}";
        }
    }
}
